/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb;


import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;

/**
 *
 * @author alexcarpentieri
 */
@Stateless
public class GestoreCassiere implements GestoreCassiereLocal {
    @EJB
    private ClienteFacadeLocal clienteFacade;
    @EJB
    private CassiereFacadeLocal cassiereFacade;
    @EJB
    private RaccoltaPuntiDelClienteFacadeLocal raccoltaPuntiDelClienteFacade;
    @EJB
    private EsercizioCommercialeFacadeLocal esercizioCommercialeFacade;
    
    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
  
    @Override
    public Cassiere aggiungiCassiere(String user, String password, EsercizioCommerciale esercizioCommerciale) {
        Cassiere cassiere=new Cassiere();
        cassiere.setEsercizioCommerciale(esercizioCommerciale);
        cassiere.setPassword(password);
        cassiere.setUserName(user);
        cassiereFacade.create(cassiere);
        return cassiere;
    }
    
    @Override
    public Cassiere aggiornaCassiere(Cassiere cassiere){
        cassiereFacade.edit(cassiere);
        return cassiere;
    }

    @Override
    public Cliente CercaClientePerCodiceBarre(String codiceBarre) {
        List<Cliente> listAll= clienteFacade.findAll();
        for(Cliente cliente:listAll){
            if(cliente.getCodiceBarre().compareTo(codiceBarre)==0)
                return cliente;
        }  
        return null;
    }

    @Override
    public Cassiere getCassiere(String user, String password) {
        List<Cassiere> listAll=cassiereFacade.findAll();
        for(Cassiere cassiere:listAll){
            if( cassiere.getNameUser().compareTo(user)==0 && cassiere.getPassword().compareTo(password)==0)
                return cassiere;
        }  
        return null;
    }

    @Override
    public RaccoltaPuntiDelCliente aggiornaRaccoltaPunti(String codiceBarre, String esercizioCommerciale,int numeroPunti) {
        List<EsercizioCommerciale> esercizioCommercialeList= esercizioCommercialeFacade.findAll();
        List<Cliente> clienteList= clienteFacade.findAll();
        EsercizioCommerciale esercizio=null;
        Cliente cliente=null;
        //cerco l'esercizio commerciale che ha un certo nome
        for(EsercizioCommerciale e:esercizioCommercialeList){
             if(e.getUserName().equals(esercizioCommerciale)){
                 esercizio=e;
             }
        }
        //ritorno null se non ho trovato nessun esercizio commerciale con il nome dato
        if(esercizio==null)
            return null;
        //cerco il cliente con il codice fiscale
        for(Cliente e:clienteList){
            if(e.getCodiceBarre().equals(codiceBarre)){
                cliente=e;
            }
        }
        //se non trovo il cliente con il codice fiscale ritorno null
        if(cliente==null)
            return null;
        //prendo le campagne raccolta punti dell'esercizio commerciale
        List<CampagnaRaccoltaPunti> campagnaRaccoltaPuntiList=esercizio.getCampagnaRaccoltaPuntiList();
        //prendo le campagne raccolte punti a cui l'utente è iscritto
        List<RaccoltaPuntiDelCliente> raccoltaPuntiDelClienteList=cliente.getRaccoltaPuntiDelClienteList();
        //trovo la campagna punti dell'esercizio commerciale più recente
        CampagnaRaccoltaPunti mostRecent= new GestoreCampagnaRaccoltaPunti().mostRecent(campagnaRaccoltaPuntiList);
        //ritorna la raccolta punti del cliente se la trova
        for(RaccoltaPuntiDelCliente e:raccoltaPuntiDelClienteList){
            if(e.getCampagnaRaccoltaPunti().equals(mostRecent)){
                e.setPunteggio(e.getPunteggio()+numeroPunti);
                raccoltaPuntiDelClienteFacade.edit(e);
                clienteFacade.edit(cliente);
                return e;
            }    
        }
        
        // se sono qui vuol dire che non ho trovato la raccolta punti e allora iscrivo l'utente
        RaccoltaPuntiDelCliente nuovaRaccolta= new RaccoltaPuntiDelCliente();
        nuovaRaccolta.setCampagnaRaccoltaPunti(mostRecent);
        nuovaRaccolta.setPunteggio(new Long(numeroPunti));
        raccoltaPuntiDelClienteList.add(nuovaRaccolta);
        cliente.setRaccoltaPuntiDelClienteList(raccoltaPuntiDelClienteList);
        raccoltaPuntiDelClienteFacade.create(nuovaRaccolta);
        //clienteFacade.edit(cliente);
        
        return nuovaRaccolta;
    }
    
    
    
    
}
